import Fields from './wt-model-field'

// model 对象模板
const ModelDefault = {
	// 对象名称标题，例如“入院记录”
	title: '',
	// 对象名字，用来标识数据对象。
	name: '',
	// 对象在显示集合中用来查询的名字
	// tableName: '',
	// 如果true，则该对象不进行summary显示
	// noSummary: false,
	// 为该对象使用自定义组件
	// customDisplay: undefined,
	// 是否是单一记录类型，如果是，则使用wt-model-info显示记录数据，并支持修改和删除；如果不是，则使用wt-model-table显示列表数据，并支持增删改
	single: false,
	// 对象的查询操作配置
	query: {},
	// 对象的新建操作配置
	new: {},
	// 对象的计数查询配置
	count: {},
	// 对象的更新操作配置
	update: {},
	// 对象的删除操作配置
	delete: {},
	// 对象的id字段名称
	id_field: {},
	// 对象的字段集合
	fields: [],
	// 构建一个快速根据tableName查询指定字段的缓存
	getTableFieldByName: function(name) {
		if (this._tableFieldsCache === undefined) {
			this._tableFieldsCache = {};
		}
		if (this._tableFieldsCache[name] !== undefined) {
			return this._tableFieldsCache[name];
		}
		else {
			let field = null;
			for (let i = 0; i < this.fields.length; i ++) {
				let f = this.fields[i];
				if (f.tableName == name) {
					field = f;
					break;
				}
			}
			this._tableFieldsCache[name] = field;
			return field;
		}
	},
};

const FieldDefault = {
	// 该字段的名称label，用于在表单和表格里显示标题
	label: '',
	// 该字段的类型
	type: Fields.types.text,
	// 是否在列表、信息展示中进行显示
	display: true,
	// 是否在wt-model-summary中显示该字段
	summary: false,
	// 该字段在显示时用来获取数据的名字。
	tableName: '',
	// 是否是只读字段（可以用自定义组件customComponent来设置该字段值）
	// readonly: false,
	// 字段的单位，单位将在显示该字段时自动拼接到显示内容中。
	// unit: undefined,
	// 字段在表单里的输入框大小，可选值为mini/small/large
	// formSize: undefined,
	// 该字段是否为多选，仅在type为Select或autocomplete时有效
	// multiple: false,
	// 该字段备选项的查询配置，仅在type为Select或autocomplete时有效
	// query: undefined,
	// 该字段用来更新和保存的名字
	// name: '',
	// 如果true，该字段不会被保存和更新。
	// noSave: false,
	// 字段验证规则，参考Element的表单验证规则http://element.eleme.io/#/zh-CN/component/form
	// rules: undefined,
	// 字段值最后是否需要转换成json字符串进行保存
	// saveAsJson: false,
	// 如果true，该字段通过对应的字段修改组件进行更新（不直接保存）。
	// uploadByComponent: false,
	// 如果true，并且uploadByComponent为true，则该字段将在整个数据储存之前由组件更新。
	// preSubmit: true,
	// 如果指定了builder函数，则在获取到查询结果后调用该builder自定义构建字段的值
	// builder: undefined,
	// 字段的上传配置，通常用于uploadByComponent为true的情况。
	// upload: undefined
	// 如果不为空，则使用该自定义组件代替默认编辑组件
	// customComponent: undefined
}

function processModels(models) {
	for (let i = 0; i < models.length; i ++) {
		processModel(models[i], models);
	}
}

function findModelByName(models, name) {
	for (let i = 0; i < models.length; i ++) {
		if (models[i].name == name) {
			return models[i];
		}
	}
	return null;
}

function processModel(model, models) {
	// 补全缺失的字段
	for (let item in ModelDefault) {
		if (model[item] === undefined) {
			model[item] = ModelDefault[item];
		}
	}

	for(let i = 0; i < model.fields.length; i ++) {
		processField(model.fields[i], model, models);
	}
}

function processField(field, model, models) {
	if (field.linkedModel && typeof field.linkedModel == 'string') {
		let modelName = field.linkedModel;
		let model = findModelByName(models, modelName);
		if (model == null) {
			console.error('Field' + field.tableName + ': unable to find linkedModel \'' + modelName + '\'!');
		}
		else {
			field.linkedModel = model;
		}
	}
	if (field.conditions) {
		for (let i in field.conditions) {
			let condition = field.conditions[i];
			for (let f in condition.fields) {
				if (typeof condition.fields[f] == 'string') {
					condition.fields[f] = model.getTableFieldByName(condition.fields[f])
				}
			}
		}
	}
}

export default {
	processModels: processModels,
	processModel: processModel,
	processField: processField
}